package org.example.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.example.vo.HttpResult;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Author：无敌暴龙战士
 * @Package：org.example.handler
 * @Project：learn_spring_security
 * @name：MyAuthenticationSuccessHandle
 * @Date：2025/2/13 0:14
 * @Filename：MyAuthenticationSuccessHandle
 * @Description: 认证成功处理器 认证成功调用
 */
@Component
@Slf4j

public class MyAuthenticationSuccessHandle implements AuthenticationSuccessHandler {

    @Resource
    ObjectMapper objectMapper;//序列化 反序列化(json)

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {

        //构建一个HTTP响应，将登录成功的消息以JSON格式返回给客户端。
        //1. 创建HttpResult对象
        HttpResult result = HttpResult.builder().code(1).msg("登录成功").build();
 
        //使用建造者模式（Builder Pattern）创建了一个HttpResult对象。HttpResult对象包含两个字段：code和msg。code表示响应的状态码，
        // 这里设置为1，表示成功；msg表示响应的消息，"登录成功"。

        //2. 将HttpResult对象转换为JSON字符串：

        String responseJSON = objectMapper.writeValueAsString(result);
        //使用objectMapper（通常是一个ObjectMapper实例，用于处理JSON数据）将HttpResult对象转换为JSON格式的字符串。responseJSON变量存储了这个JSON字符串。

        //3. 设置HTTP响应的字符编码和内容类型：
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=utf-8");
        //设置了HTTP响应的字符编码为UTF-8，并指定了响应的内容类型为application/json;charset=utf-8，表示返回的数据是JSON格式的，并且使用UTF-8编码。

        //4. 获取响应的输出流并写入JSON数据：
        PrintWriter writer = response.getWriter();
        writer.write(responseJSON);
        writer.flush();
        writer.close();


    }
}
